package com.itshops.controller;

import com.itshops.utils.Constants;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

/**
 * BaseServlet用于集中处理方法的调用
 * 以及返回值处理
 * 以及默认页对应方法
 */

public class BaseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接收请求的标识符
        String method = req.getParameter(Constants.TAG);

        //标识异常处理
        if (method==null&&method.equals("")){
            method= Constants.INDEX;
        }

        //判断标识符然后调用对应的业务逻辑方法,利用反射
        //获取class对象
        Class clazz = this.getClass();

        try {
            //获取方法,利用标识符合对应方法相同,传入标识方法名，和两个可变参数
            Method method1 = clazz.getMethod(method, HttpServletRequest.class, HttpServletResponse.class);
            //执行方法并且得到方法返回参数
            Object result = method1.invoke(this, req, resp);

            //判断返回返回参数，执行转发、重定向、返回字符
            if (result!=null){
                String s = (String) result;

                //转发
                if (s.startsWith(Constants.FORWARD)){
                    String path = s.substring(s.indexOf(Constants.FLAG) + 1);
                    req.getRequestDispatcher(path).forward(req,resp);
                }
                //重定向
                else if (s.startsWith(Constants.REDIRECT)){
                    String path = s.substring(s.indexOf(Constants.FLAG) + 1);
                    resp.sendRedirect(path);
                }
                //返回字符
                else {
                    resp.getWriter().println(s);
                }



            }
            
            
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 当method标识符没有值，默认赋index给method访问controller的index方法
     * 将方法提取到baseservlet中
     * 默认处理：跳转到程序的首页
     */
    public String index(HttpServletRequest rep,HttpServletResponse res){
        return Constants.FORWARD+"/index.jsp";
    }
}
